//该类完成对未知类型的封装，基本核心为内存复制+强制类型状态+动态类型检测
//这里有两种实现思路，有优有劣
//第一种，使用memcpy复制内存，好处是不需要目标类等提供相关支持，缺点是如果类内部用到了指针的话，就不能进行深层次的拷贝复制了。
//第二种，使用T(T&)这种形式的有参构造函数，能够解决第一种中的深层次拷贝问题，缺点就是需要目标类提供这样的有参构造，如果目标类没有显示定义的话，同样会面临深层次拷贝的问题。
#ifndef C3POM_OBJECT_H
#define C3POM_OBJECT_H
#include<typeinfo>
#include<string>
#include"log.h"
namespace c3pom
{
	class Object
	{
		private:
			Log* log;
			std::string _typename;
			void* _data;
			int _size;
		public:
			Object();
			bool isbasictype();
			bool isnull();
			template<typename T>
				Object(T t)
				{
					log=Log::getInstance();
					operator=(t);
				}

			template<typename T>
				bool istype()
				{
					return istype(typeid(T).name());
				}
			bool istype(std::string name);

			template<typename T>
				void operator=(T t)
				{
					_typename=typeid(T).name();
					_size=sizeof(T);
					_data=(void *)new T(t);
				}

			void operator=(Object&);

			template<typename T>
				T castto()
				{
					log->info(typeid(T).name());
					if(std::string(typeid(T).name())!=_typename)
					{
						log->warn(std::string("this type is")+_typename+std::string("but it will be casted to")+typeid(T).name());
					}
					return *((T*)_data);
				}

			std::string getTypename();
	};
}
#endif
